package control;

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import beans.Panier;
import beans.Produit;
import database.MaConnexion;

/**
 * Servlet implementation class Achat TODO Mettre en place un Command Pattern
 */
public class Achat extends HttpServlet {
	// autogénéré lors de la création de la servlet
	private static final long serialVersionUID = 1L;
	/**
	 * Connexion unique (singleton) à la bdd
	 */
	private Connection connexion;

	/**
	 * liste des produits - pour affichage
	 */
	List<Produit> listeProduits;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public Achat() {
		super();
		// initialisation de la liste de produits
		listeProduits = new ArrayList<Produit>();

		// création de la connexion à la bdd
		try {
			connexion = MaConnexion.getInstance().getConnexion();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block ClassNotFoundException
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block SQLException
			e.printStackTrace();
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doRequest(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		/**
		 * stockage des produits en cours d'achat
		 */
		Panier monPanier;

		// récup session
		HttpSession session = request.getSession();

		// session existe ?
		if (session != null) {
			// récup du panier s'il existe
			if (session.getAttribute("panier") != null) {
				monPanier = (Panier) session.getAttribute("panier");
			} else {
				// sinon création du panier vide
				monPanier = new Panier();
			}

			// récupération en bdd de la liste des produits
			try {
				Statement stmt = connexion.createStatement();

				// résultat de la requête
				ResultSet rs = stmt
						.executeQuery("SELECT id, name, price, quantity, unit FROM produit");

				// ajout des produits à la liste qui sera donc mis à jour si la
				// bdd est modifiée
				while (rs.next()) {
					Produit produit = new Produit(rs.getInt("id"),
							rs.getString("name"), rs.getInt("quantity"),
							rs.getString("unit"), rs.getDouble("price"));
					// ajout à la liste si pas déjà présent
					if (!listeProduits.contains(produit)) {
						listeProduits.add(produit);
					}
				}
				// fermeture du ResultSet
				rs.close();
				// fermeture du statement
				stmt.close();

			} catch (SQLException e) {
				// TODO Auto-generated catch block SQLException
				e.printStackTrace();
			}

			// stockage de la liste des produits dans la requete
			request.setAttribute("listeProduits", listeProduits);

			// traitement des actions de l'utilisateur sur le formulaire

			// si fruit sélectionné on récupère son id (value de l'option du
			// select)
			String idProduit = request.getParameter("produit");

			// test le paramètre 'action' pour retirer un article ou vider le
			// panier
			String actionStr = request.getParameter("action");
			int action = -1; // init
			// test si 'action' existe : si oui le converti en integer
			if (actionStr != null)
				action = Integer.parseInt(actionStr);

			// parcours des possibles valeurs du paramètre "action"
			switch (action) {
			case 0:
				// vide le panier
				monPanier.empty();
				// panier vide en remis en session
				session.setAttribute("panier", monPanier);
				break;
			case 1:
				// retire un type de produit du panier (marche car methode
				// equals de Produit définie)
				// idProduit doit être renseigné
				if (idProduit != null) {
					monPanier.remove(new Produit(Integer.valueOf(idProduit)));
				}
				break;
			default:
				break;
			}

			// bouton submit appuyé - test pour savoir lequel
			String validation = request.getParameter("valider");
			if (validation != null) {

				// ajout
				// on vient bien de la page d'achat : acheter ou ajouter ?
				if (idProduit != null && action == -1) {
					if ("ajouter".equalsIgnoreCase(validation)) {
						// on devrait tester si le paramètre est bien non nul et
						// un chiffre...
						int quantite = Integer.parseInt(request
								.getParameter("quantite"));
						// ajout du produit et sa quantité au panier
						// récup du produit
						Produit produit = null; 
						//parcours des produits de la liste jusqu'à trouver le bon pour le récupérer
						for (Produit p : listeProduits) {
							if(p.getId() == Integer.valueOf(idProduit)){
								produit = p;
								continue;
							}
						}
						//si produit toujours null, la méthode add ne l'ajoute pas au panier
						monPanier.add(produit, Integer.valueOf(quantite));
						// mise en session du panier mis à jour
						session.setAttribute("panier", monPanier);
					}
				}
				// réglement du panier
				if ("acheter".equalsIgnoreCase(validation)) {
					// affichage de la facture
					request.getRequestDispatcher("/affichage.jsp").forward(
							request, response);
					return;
				}

			}

			// par défaut retour à la première page
			request.getRequestDispatcher("/index.jsp").forward(request,
					response);
		}
		return;

	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		doRequest(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		doRequest(request, response);
	}

}
